package com.practice.springboot_01_zwj.service.impl;

import com.practice.springboot_01_zwj.entity.dto.BatchSubTaskDTO;
import com.practice.springboot_01_zwj.entity.dto.MainTaskWithSubTasksDTO;
import com.practice.springboot_01_zwj.entity.dto.SubTaskWithBatchDTO;
import com.practice.springboot_01_zwj.entity.dto.TaskAllQueryRequest;
import com.practice.springboot_01_zwj.mapper.AccountInfoMapper;
import com.practice.springboot_01_zwj.service.TaskExportService;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
public class TaskExportServiceImpl implements TaskExportService {

    private final TaskServiceImpl taskService;
    private final AccountInfoMapper accountMapper;

    @Autowired
    public TaskExportServiceImpl(TaskServiceImpl taskService, AccountInfoMapper accountMapper) {
        this.taskService = taskService;
        this.accountMapper = accountMapper;
    }

    @Override
    public Resource exportTasks(TaskAllQueryRequest request) {
        try (Workbook workbook = new XSSFWorkbook();
             ByteArrayOutputStream out = new ByteArrayOutputStream()) {

            // 获取数据
            List<MainTaskWithSubTasksDTO> tasks = taskService.getAllTasksWithDetails(request);

            // 创建Excel工作表
            Sheet sheet = workbook.createSheet("任务数据");
            sheet.setDefaultColumnWidth(20);

            // 创建样式
            CellStyle headerStyle = createHeaderStyle(workbook);
            CellStyle mainTaskStyle = createLeftAlignedStyle(workbook); // 左对齐样式
            CellStyle subTaskStyle = createLeftAlignedStyle(workbook); // 左对齐样式
            CellStyle batchTaskStyle = createLeftAlignedStyle(workbook); // 左对齐样式

            // 创建表头
            createHeaderRow(sheet, headerStyle);

            int rowNum = 1; // 从第2行开始（表头后）

            for (MainTaskWithSubTasksDTO mainTask : tasks) {
                if (!CollectionUtils.isEmpty(mainTask.getSubTasks())) {
                    for (SubTaskWithBatchDTO subTask : mainTask.getSubTasks()) {
                        if (!CollectionUtils.isEmpty(subTask.getBatchSubTasks())) {
                            for (BatchSubTaskDTO batchTask : subTask.getBatchSubTasks()) {
                                // 创建一行（包含主任务、子任务和批量子任务的所有信息）
                                Row row = sheet.createRow(rowNum++);
                                fillMainTaskCells(mainTask, row, mainTaskStyle);
                                fillSubTaskCells(subTask, row, subTaskStyle);
                                fillBatchTaskCells(batchTask, row, batchTaskStyle);
                            }
                        } else {
                            // 没有批量子任务，只填充主任务和子任务
                            Row row = sheet.createRow(rowNum++);
                            fillMainTaskCells(mainTask, row, mainTaskStyle);
                            fillSubTaskCells(subTask, row, subTaskStyle);
                            // 批量子任务列留空
                            fillEmptyBatchTaskCells(row, batchTaskStyle);
                        }
                    }
                } else {
                    // 没有子任务，只填充主任务
                    Row row = sheet.createRow(rowNum++);
                    fillMainTaskCells(mainTask, row, mainTaskStyle);
                    // 子任务和批量子任务列留空
                    fillEmptySubTaskCells(row, subTaskStyle);
                    fillEmptyBatchTaskCells(row, batchTaskStyle);
                }
            }

            // 写入到输出流
            workbook.write(out);
            return new ByteArrayResource(out.toByteArray());

        } catch (IOException e) {
            throw new RuntimeException("导出Excel失败: " + e.getMessage(), e);
        }
    }
    // 创建左对齐样式
    private CellStyle createLeftAlignedStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.LEFT); // 设置左对齐
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        return style;
    }

    // 填充主任务单元格
    private void fillMainTaskCells(MainTaskWithSubTasksDTO task, Row row, CellStyle style) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        createCell(row, 0, task.getMainName(), style); // 目标
        createCell(row, 1, task.getDeptName(), style); // 科室
        createCell(row, 2, task.getExecutorAcName(), style); // 执行人
        createCell(row, 3, formatDate(task.getPlanEndTime(), sdf), style); // 计划完成时间

        // 总体完成情况 - 整数百分比
        createCell(row, 4, formatIntegerProgress(task.getTaskProgress()), style);

        // 时间进度 - 保留两位小数
        createCell(row, 5, formatDecimalProgress(task.getTimeProgress()), style);

        createCell(row, 6, convertTaskState(task.getTaskState()), style); // 当前状态
    }

    // 填充子任务单元格
    private void fillSubTaskCells(SubTaskWithBatchDTO task, Row row, CellStyle style) {
        createCell(row, 7, task.getSubName(), style); // 科室关键结果
        createCell(row,8,task.getSubExecutorAcNames(),style);//负责团队
        // 关键进度 - 整数百分比
        createCell(row, 9, formatIntegerProgress(task.getFinishProgress()), style);
    }

    // 填充批量子任务单元格
    private void fillBatchTaskCells(BatchSubTaskDTO task, Row row, CellStyle style) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        createCell(row, 10, task.getTaskName(), style); // 本月关键结果
        createCell(row, 11, task.getTaskDescription(), style); // 达成情况
        createCell(row, 12, formatDate(task.getEndTime(), sdf), style); // 完成时间
        createCell(row, 13, task.getSelfRating(), style); // 自评分
        createCell(row, 14, task.getBatchExecutorAcName(), style); // 执行人
        createCell(row, 15, task.getImplementDescription(), style); // 工作任务及落实情况
//        // 完成进度 - 整数百分比
//        createCell(row, 10, formatIntegerProgress(task.getProgress()), style);
    }

    // 填充空的子任务单元格（当没有子任务时）
    private void fillEmptySubTaskCells(Row row, CellStyle style) {
        createCell(row, 0, "", style); // 关键结果
        createCell(row, 1, "", style); // 执行人
        createCell(row, 2, "", style); // 关键结果完成度
        createCell(row, 3, "", style); // 关键结果完成度
        createCell(row, 4, "", style); // 关键结果完成度
        createCell(row, 5, "", style); // 关键结果完成度
        createCell(row, 6, "", style); // 关键结果完成度
    }

    // 填充空的批量子任务单元格（当没有批量子任务时）
    private void fillEmptyBatchTaskCells(Row row, CellStyle style) {
        createCell(row, 7, "", style); // 本月关键结果
        createCell(row, 8, "", style); // 完成进度
        createCell(row, 9, "", style); // 完成时间
    }

    // 创建表头行
    private void createHeaderRow(Sheet sheet, CellStyle style) {
        Row headerRow = sheet.createRow(0);
        String[] headers = {
                "目标","科室","执行人", "计划完成时间", "总体完成情况", "时间进度", "当前状态",
                 "科室关键结果", "负责团队","完成进度", "本月关键结果", "达成情况", "计划完成时间","自评分", "执行人","工作任务及落实情况"
        };

        for (int i = 0; i < headers.length; i++) {
            Cell cell = headerRow.createCell(i);
            cell.setCellValue(headers[i]);
            cell.setCellStyle(style);
        }
    }

    // 格式化进度值为整数百分比 (0%, 100%, 50%等)
    private String formatIntegerProgress(Double progress) {
        if (progress == null) {
            return "";
        }

        // 转换为百分比值
        double percentage = progress < 1 ? progress * 100 : progress;

        // 处理特殊值
        if (percentage == 0.0) {
            return "0%";
        }
        if (percentage == 100.0) {
            return "100%";
        }

        // 四舍五入取整
        return String.format("%.0f%%", percentage);
    }

    // 格式化进度值为带两位小数的百分比 (0.00%, 100.00%, 50.25%等)
    private String formatDecimalProgress(Double progress) {
        if (progress == null) {
            return "";
        }

        // 转换为百分比值
        double percentage = progress < 1 ? progress * 100 : progress;

        // 处理特殊值
        if (percentage == 0.0) {
            return "0.00%";
        }
        if (percentage == 100.0) {
            return "100.00%";
        }

        // 保留两位小数
        return String.format("%.2f%%", percentage);
    }

    // 转换任务状态值为文字描述
    private String convertTaskState(Integer taskState) {
        if (taskState == null) {
            return "";
        }
        switch (taskState) {
            case 0: return "未开始";
            case 1: return "进行中";
            case 2: return "已完成";
            case 3: return "已延期";
            default: return String.valueOf(taskState);
        }
    }

    // 创建单元格辅助方法
    private void createCell(Row row, int column, Object value, CellStyle style) {
        Cell cell = row.createCell(column);
        cell.setCellStyle(style);

        if (value == null) {
            cell.setCellValue("");
        } else if (value instanceof Number) {
            cell.setCellValue(((Number) value).doubleValue());
        } else if (value instanceof Date) {
            cell.setCellValue((Date) value);
        } else {
            cell.setCellValue(value.toString());
        }
    }

    // 日期格式化辅助方法
    private String formatDate(Date date, SimpleDateFormat sdf) {
        return date != null ? sdf.format(date) : "";
    }

    // 创建表头样式（保持居中）
    private CellStyle createHeaderStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        Font font = workbook.createFont();
        font.setBold(true);
        font.setFontHeightInPoints((short) 12);
        style.setFont(font);
        style.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        style.setAlignment(HorizontalAlignment.CENTER); // 表头保持居中
        return style;
    }
}